/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.metier.service;

import net.etrs.formathlon.metier.exception.MetierException;

/**
 * Classe pour la gestion de l'entité.
 * @author OPIF
 */
public abstract class EntiteManager {

    
    /**
     * Constructeur private pour cette classe de service.
     */
    private EntiteManager() {}
    
    
    /**
     * Retourne l'intitulé de l'entité correspondant au niveau demandé.
     * Il se peut que l'entité contienne le nom d'une division alors que l'on
     * demande une direction. Le code est alors tronqué pour ne retourner
     * que le code de la direction.
     * @param entite
     * @param niveau
     * @return L'entité
     */
    public static String getEntite(String entite, NiveauHierarchique niveau) throws MetierException{
        StringBuilder retour=new StringBuilder();
        String[] hierarchie=entite.split("/");
        
        //Si le niveau demandé n'est pas contenu dans l'entité en paramètre
        if(niveau.getNiveau()>hierarchie.length){
            throw new MetierException(MetierException.Type.ENTITE_NON_INCLUSE);
        }
        
        //Recréation de l'entité jusqu'au niveau demandé.
        for(int i=0; i<niveau.getNiveau(); i++){
            if(retour.length()!=0){
                retour.append("/");
            }
            retour.append(hierarchie[i]);
        }
        return retour.toString();
    }
    
    /**
     * Retourne l'intitulé de la sous-entité correspondant au niveau demandé.
     * Il se peut que l'entité contienne le nom d'une division alors que l'on
     * demande une direction. Le code est alors tronqué pour ne retourner
     * que le code de la direction.
     * @param entite
     * @param niveau
     * @return L'entité
     * @throws MetierException 
     */
    public static String getSubEntite(String entite, NiveauHierarchique niveau) throws MetierException{
        String[] hierarchie=entite.split("/");
        
        //Si le niveau demandé n'est pas contenu dans l'entité en paramètre
        if(niveau.getNiveau()>hierarchie.length){
            throw new MetierException(MetierException.Type.ENTITE_NON_INCLUSE);
        }
        
        //Recréation de l'entité jusqu'au niveau demandé.
        return hierarchie[niveau.getNiveau()-1].toString();
    }
    
    /**
     * Retourne l'intitulé de la entité choisie.
     * ex : si on veut simplement récupérer la div avec le cours.
     * @param niveauD
     * @param niveauF
     * @return L'entité
     * @throws MetierException 
     */
    public static String getEntite(String entite, NiveauHierarchique niveauD, NiveauHierarchique niveauF) throws MetierException{
        StringBuilder retour=new StringBuilder();
        String[] hierarchie=entite.split("/");
        
        //Si le niveau de début demandé n'est pas contenu dans l'entité en paramètre
        if(niveauD.getNiveau()>hierarchie.length){
            throw new MetierException(MetierException.Type.ENTITE_NON_INCLUSE);
        }
        //Si le niveau de fin demandé n'est pas contenu dans l'entité en paramètre
        if(niveauF.getNiveau()>hierarchie.length){
            throw new MetierException(MetierException.Type.ENTITE_NON_INCLUSE);
        }

        //Recréation de l'entité du niveau de début demandé
        //jusqu'à celui de fin demandé
        for(int i=niveauD.getNiveau(); i<=niveauF.getNiveau(); i++){
            if(retour.length()!=0){
                retour.append("/");
            }
            retour.append(hierarchie[i-1]);
        }
        return retour.toString();
    }
    
    
    /**
     * Enumeration permettant de préciser le niveau hiérarchique pour
     * la recherche des subordonnés.
     */
    public enum NiveauHierarchique{
        ETRS(1), DIRECTION(2), DIVISION(3), COURS(4);

        private int niveau;
        
        private NiveauHierarchique(int niveau) {
            this.niveau=niveau;
        }

        public int getNiveau() {
            return niveau;
        }
        
    }
    
}
